S14-06 SSR-Next13-项目:mr-ssr-next13-ts-music-mall
[TOC]
接口文档
GET 搜索建议
说明 : 调用此接口 , 获取首页搜索建议
请求方法 : GET
接口地址 : /searchsuggest/get
必选参数 : 无
调用例子 : baseURL + /searchsuggest/get
{
"code": 200,
"data": {
"id": 30001,
"defaultKey": "蓝牙耳机",
"configKey": [
{
"1": "迪士尼Q2"
},
{
"2": "日常元素"
}
]
}
}
GET 首页信息
说明 : 调用此接口 , 获取首页商品信息
请求方法 : GET
接口地址 : /home/info
必选参数 : 无
调用例子 : baseURL + /home/info
{
"code": 200,
"data": {
"banners":[
],
"categorys":[
]
}
}
GET 热门商品
说明 : 调用此接口 , 获取热门商品
请求方法 : GET
接口地址 : /hotproduct_v2/gets
必选参数 : 无
调用例子 : baseURL + /hotproduct_v2/gets
{
"code": 200,
"data": {
"count": 8,
"hasMore": false,
"hotProduct":[
]
}
}
GET 所有商品
说明 : 调用此接口 , 获取所有商品
请求方法 : GET
接口地址 : /allProduct/gets
必选参数 : 无
调用例子 : baseURL + /allProduct/gets
{
"code": 200,
"data": {
"count": 150,
"allProduct":[
]
}
}
GET 商品详情信息
说明 : 调用此接口 , 获取商品详情信息
请求方法 : GET
接口地址 : /special/getdetail
必选参数 :
specialTopicId: 商品id ( 目前只有 55001 和 68001 两个商品的详情 )
调用例子 : baseURL + /special/getdetail?specialTopicId=68001
{
"code": 200,
"data": {
"id": 55001,
"name": "热销爆品",
"linkedUrl": null,
"specialTopicProducts":[],
"products": [],
.....
}
}
POST 搜索商品
说明 : 调用此接口 , 获取商品详情信息
请求方法 : POST
接口地址 : /store/api/product/searchl
请求头信息 :
{
"Content-Type": "application/x-www-form-urlencoded",
}
必选参数 :
limit: 60
offset: 0
key: 真无线
调用例子 : baseURL + /special/getdetail?specialTopicId=68001
{
"code": 200,
"data": {
"id": 55001,
"name": "热销爆品",
"linkedUrl": null,
"specialTopicProducts":[],
"products": [],
.....
}
}
环境搭建
项目初始化
注意: 不同与nuxt,next的项目可以在中文路径中创建。
pnpm dlx create-next-app@latest
最新版(next15)
集成-样式
依赖包:
- normalize.css
- 安装:
pnpm i normalize.css
- 安装:
- sass
- 安装:
pnpm i sass
- 安装:
- classnames
- 安装:
pnpm i classnames
- 安装:
配置:
在tsconfig.json
中通过baseUrl
和paths
配置@
别名
自定义全局样式:
normalize.css
1、安装依赖包
2、在pages/_app.tsx
中全局引入 normalize.css
variables.scss
1、定义全局样式变量
2、在global.scss
中使用@import
导入样式
global.scss
1、定义全局样式global.scss
2、在pages/_app.tsx
中导入,使全局有效
SEO
可以在_document.js
中添加Head,并在其中进行SEO配置
集成-RTK
Redux Toolkit 是官方推荐的编写 Redux 逻辑的方法。
在前面我们学习Redux的时候应该已经发现,redux的编写逻辑过于的繁琐和麻烦。
并且代码通常分拆在多个文件中(虽然也可以放到一个文件管理,但是代码量过多,不利于管理);
Redux Toolkit包旨在成为编写Redux逻辑的标准方式,从而解决上面提到的问题;
在很多地方为了称呼方便,也将之称为“RTK”;
安装
依赖包:
- next-redux-wrapper:将服务端redux存储的数据同步一份到客户端上。
- 安装:
pnpm i next-redux-wrapper
- 可以避免在访问服务器端渲染页面时store的重置
- 该库提供了HYDRATE调度操作
- 当用户访问动态路由或后端渲染的页面时,会执行Hydration来保持两端数据状态一致
- 比如:每次当用户打开使用了getStaticProps或getServerSideProps函数生成的页面时,HYDRATE将执行调度操作。
- 安装:
- @reduxjs/toolkit、react-redux
- 安装:
pnpm i @reduxjs/toolkit react-redux
- 安装:
集成过程
1、创建store:configureStore()
import { configureStore } from '@reduxjs/toolkit'
import counterReducer from './features/counter'
import homeReducer from './features/home'
+ const store = configureStore({
+ reducer: {
+ counter: counterReducer,
+ home: homeReducer
+ }
+ })
export default store
2、创建reducer片段:createSlice()
import { createSlice } from "@reduxjs/toolkit";
+ const counterSlice = createSlice({
+ name: 'counter',
+ initialState: {
+ counter: 100
+ },
+ reducers: {
+ addCounter(state, action) {
+ state.counter += action.payload
+ },
+ subCounter(state, action) {
+ state.counter -= action.payload
+ }
+ }
+ })
+ export const { addCounter, subCounter } = counterSlice.actions
+ export default counterSlice.reducer
3、Next:添加 HYDRATE 操作,保证服务端和客户端数据的一致性
4、Next:通过 createWrapper() 方法包裹一个通过函数返回的store并导出
5、TS类型:为模块的initialState添加TS类型
6、TS类型:为store的dispatch、state添加TS类型
7、在_app.tsx
中挂载store到app上
8、在组件中使用 useSelector() 获取store中的数据
6、在组件中使用 useDispatch() 修改store中的数据
7、效果
异步操作
1、在home.ts
中发送异步请求
+ export const fetchHomeMultidataAction = createAsyncThunk('home/multidata', async () => {
const res = await axios.get('http://123.207.32.32:8000/home/multidata')
return res.data.data
})
const homeSlice = createSlice({
name: 'home',
initialState: {
banners: [],
recommends: []
},
+ extraReducers(builder) {
+ builder
+ .addCase(fetchHomeMultidataAction.fulfilled, (state, { payload }) => {
state.banners = payload.banner.list
state.recommends = payload.recommend.list
})
+ .addCase(fetchHomeMultidataAction.rejected, (state) => {
console.log('fetchHomeMultidataAction.rejected')
})
}
})
2、在组件中调用 fetchHomeMultidataAction()
集成-AntDesign5
依赖包:
- antd
- 安装:
pnpm i antd
- 安装:
- @types/antd
- 安装:
pnpm i @types/antd -D
- 安装:
基本实现:
1、安装依赖包
2、重置antd样式
3、使用ant组件
import { Button } from 'antd'
注意:
- antd默认支持基于ES modules的tree shaking,直接引入
import { Button } from 'antd'
就有按需加载的效果
Layout
基本实现
1、组件:navbar
2、组件:footer
3、在components/layout/index.tsx
中添加布局
4、在pages/_app.tsx
中用<Layout>
组件包裹<Component>
组件,应用布局
5、效果
组件:navbar
页面布局
1、基本布局
功能
显示购物车上标
1、在navbar
组件中,通过 useSelector()
方法获取store中的counter数据
2、渲染counter
组件:search
页面布局
1、使用组件
2、页面布局
请求数据
1、service
2、在store的异步action中发送请求
3、在pages/index.tsx
组件中通过 getServerSideProps()
方法获取SSR数据,并存储到redux中
4、在components/navbar/index.tsx
组件中,使用 useSelector() 获取store中的数据
5、在components/search/index.tsx
组件中,接收参数,并渲染
功能
点击显示下拉面板
1、添加聚焦、失焦事件
2、实现事件函数,控制显示和隐藏下拉面板
搜索联想功能
1、添加onKeyDown
事件
2、实现事件函数,当输入搜索内容时,自动联想关键词
3、
组件:footer
home
组件:top-swiper
页面布局
1、使用组件:在pages/index.tsx
中使用组件
2、基本布局
请求数据
1、service
2、在pages/idnex.tsx
组件的getServerSideProps()
中发送网络请求
3、在pages/idnex.tsx
组件中,传递参数到<top-swiper>
组件中
4、在组件top-swiper
中接收参数,并渲染
5、在next.config.js
中配置图片域名的白名单
6、效果
7、优化:轮播图
功能
添加轮播图两侧背景
修改指示器样式
1、基本布局
2、默认选中效果
手动切换图片
1、渲染上一页、下一页
2、点击上一页、下一页事件
3、实现事件函数
组件:tab-category
1、使用组件并传递数据
2、在组件中接收数据并渲染
组件:recommend
1、使用组件并传递数据
2、基本布局
组件:section-title
1、使用组件
2、基本布局
组件:grid-view
请求数据
URL:http://codercba.com:9060/music-next/api/hotproduct_v2/gets
1、service
2、在pages/index.tsx
组件中发起网络请求
页面布局
1、使用组件:在pages/index.tsx
中使用组件
2、基本布局
组件:grid-view-item
1、使用组件
2、基本布局
3、添加打折提示,通过showTip
控制是否显示
在
grid-view
组件中设置showTip
变量在
grid-view-item
组件中根据showTip
控制是否显示
所有商品(组件复用)
请求数据
URL:http://codercba.com:9060/music-next/api/allProduct/gets
1、service
2、在pages/index.tsx
组件中发起网络请求
页面布局
1、在pages/index.tsx
组件中复用<grid-view>
组件,并传入获取的所有商品的数据
2、在<grid-view>
和<grid-view-item>
组件中,修改products
类型
其他页
详情页
页面跳转
1、页面跳转:在<recommend>
组件中跳转
请求数据
URL:http://codercba.com:9060/music-next/api/special/getdetail?specialTopicId=68001
1、service
2、在detail
组件中通过getServerSideProps()
方法请求数据
页面布局
根据请求的数据渲染组件
搜索页
页面跳转
1、跳转到搜索页
点击搜索,跳转到搜索页
同时在监听回车键的事件中,也添加跳转
2、在search
页通过router.query
获取跳转时传递的参数
请求数据
1、在search
页中通过getServerSideProps()
方法请求数据
2、service
【TODO】
打包部署
打包项目
基本部署:
1、执行pnpm run build
命令打包项目,检查是否存在错误
注意: 打包next项目时可以出现中文路径。
2、将整个项目(不包括node_modules
)上传到远程服务器中
3、在远程运行pnpm i
安装依赖包
4、在远程运行PORT=9090 pnpm run start
启动项目
5、打开网站
6、在远程运行pm2 start "PROT=9090 pnpm run start" --name music-mall
可以实现单个实例启动项目
使用PM2集群部署:
1、在远程运行pm2 init simple
创建配置文件
2、修改配置ecosystem.config.js
3、在远程运行pm2 start ecosystem.config.js
可以实现集群启动项目
购买-阿里云服务器
阿里云服务器购买地址:https://aliyun.com/
1、打开控制台
2、菜单找到:云服务器 ECS
3、创建我们 ECS
4、服务器的配置
- CentOS 7.9 / 64
- 2cpu 4G
5、配置安全组
6、系统配置,自定义密码
7、确认订单,创建实例
连接-阿里云服务器
1、VS Code 安装:Remote SSH 插件
2、Remote SSH 连接远程服务器
安装 Node
见:安装nodejs
安装n
见:安装n
安装pm2
见:安装pm2